package main

import (
	"flag"
	"fmt"
	"os"
	"path/filepath"
	"sc_eac_passer/internal/app"
	"sc_eac_passer/internal/patch"

	"gitee.com/StarCitizen_CN/stargox/pkg/core"

	"gitee.com/StarCitizen_CN/logger"
)

var (
	_ = flag.Bool("no_login_dialog", false, ".")
	_ = flag.Int("trace_enable_service", 0, ".")
	_ = flag.Int("config_enable_service", 0, ".")
	_ = flag.String("trace_env_id", "", ".")

	// 推送更新测试与发布流程：
	// 1）关闭此项并发布构建至预览
	// 2）开启此项后重新构建并部署至本地
	// 3）启动游戏
	// 4）测试结果无误之后关闭此项，更新版本号并发布
	isEnableUpdateTestChannel = false
)

const (
	//todo 移动至缓存目录
	logName = "eac_passer_launcher.log"
)

func main() {

	if !isEnableUpdateTestChannel {
		// 定义程序版本tag
		core.GitVersion = "v0.1.6"
	}

	// 处理错误
	defer recoverError()

	checkIfUpdateProcess()

	// 从这里开始依赖日志
	setupLog()
	checkNews()

	// 进行运行环境初始化
	app.Init()

	showVersionNotice()

	// 接收参数
	flag.Parse()

	// 启动游戏
	app.StartGame(os.Args)
}

func recoverError() {
	if e := recover(); e != nil {
		if r, ok := e.(error); ok && r != nil {
			logger.Err(r)
			app.ErrAlertAndJumpUrl(r, app.BOX_QG_LINK, "发现汉化工具崩溃", app.ALERTMSG_BOX_QGJUMP)
		}
	}
	logger.Disable()
}

// 处理日志文件
func setupLog() {
	if err := core.CheckAndCrateOsTemp(); err != nil {
		app.ErrAlertAndJumpUrl(err, app.BOX_QG_LINK, "错误", "初始化缓存目录失败\n"+app.ALERTMSG_BOX_QGJUMP)
		panic(err)
	}

	_ = os.Remove("eac_passer_launcher.log")
	if e := logger.Setup(
		logger.SetOutput("./eac_passer_launcher.log", true),
		logger.SetDebugMode(true),
	); e != nil {
		app.ErrAlertAndJumpUrl(e, app.BOX_QG_LINK, "错误", "初始化日志工具失败\n"+app.ALERTMSG_BOX_QGJUMP)
		// 无视错误，继续启动。
	}
}

// 需要在程序逻辑启动前使用。在开始升级之后，其逻辑与程序逻辑无关。
func checkIfUpdateProcess() {
	if *core.FUpdateMode {
		if err := core.ContinueSelfUpdate(); err != nil {
			app.ErrAlertAndJumpUrl(err, app.BOX_QG_LINK, "盒子汉化工具更新安装的时候发生错误", app.ALERTMSG_BOX_QGJUMP)
			os.Exit(1)
		}

		app.Notification("汉化工具更新已完成，请重启游戏~", "愿你今天没有30k")
		os.Exit(0)
	}
}

// 检查更新
func checkNews() {
	mirrors := patch.ReadGiteeMirrors()
	gitRepo := "https://gitee.com/StarCitizen_CN/sc_eac_passer"
	isUpdateRequired, release, checkErr := core.CheckReleaseWithGitee(gitRepo, mirrors)
	if checkErr != nil || !isUpdateRequired {
		logger.Var("更新: %v %v", checkErr, isUpdateRequired)
		return
	}

	if !isEnableUpdateTestChannel && release.IsPreRelease {
		logger.Err(fmt.Errorf("%s is pre release", release.TagName))
		return
	}

	dlcb := func(total, complete int) {
		// test
		fmt.Printf("\r %v", float32(complete)/float32(total))
	}

	app.Notification("请稍等！", "正在下载更新中")

	wd, _ := os.Getwd()
	// 0: StarCitizen_Launcher.exe
	ok, updateErr := core.SelfUpdateWithGitee(release.Assets[0], wd, "starbox_l10napp_"+core.GitVersion, "1s", dlcb)
	if updateErr != nil {
		logger.Err(updateErr)
		app.ErrAlertAndJumpUrl(updateErr, app.BOX_QG_LINK, "更新异常", "更新失败，但仍将继续尝试汉化。如果出现Error 0的问题，请重新安装汉化程序。\n如果存在杀毒软件，请暂时关闭它。\n"+app.ALERTMSG_BOX_QGJUMP)
		return
	}

	// 下载完成，立刻退出。
	if ok {
		app.Notification("请等待一会儿再启动游戏", "正在安装更新中")
		os.Exit(0)
		return
	}
}

func showVersionNotice() {
	versionFilePath := filepath.Join(patch.AttachPath, patch.VersionNoticeFile)
	data, err := os.ReadFile(versionFilePath)
	if err != nil {
		return
	}

	text := string(data)
	logger.Var("new version：%s", text)

	logger.ShowGuiMsg("更新内容", text)

	// 用完即抛
	os.Remove(versionFilePath)
}
